import { EventMgr } from "./EventMgr";

/**
 * 事件监听
 */
export class EventListener<EventId = any> {
	constructor(
		/** 事件管理器 */
		public readonly mgr: EventMgr,
		/** 监听的事件 */
		public readonly id: EventId,
		/** 事件回调 */
		public readonly callback: (data: any, e: EventListener) => any,
		/** 事件回调的this指向 */
		public readonly caller: any,
		/** 是否执行一次就取消监听 */
		public readonly once: boolean
	) {}

	/** 取消监听 */
	off() {
		this.mgr.offListener(this);
	}

	/**
	 * 事件触发
	 * @param data 携带数据
	 */
	trigger(data?: any) {
		this.callback.call(this.caller, data, this);
		if (this.once) {
			this.off();
		}
	}
}
